package hr.fer.zpr.nmbp.project2.dao;

import hr.fer.zpr.nmbp.project2.dao.exceptions.PrimaryKeyConstraintException;
import hr.fer.zpr.nmbp.project2.model.Bolnica;
import hr.fer.zpr.nmbp.project2.model.Lijecnik;
import hr.fer.zpr.nmbp.project2.model.Pacijent;

import java.util.List;
import java.util.Properties;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.exception.ConstraintViolationException;

public class LijecnikDAO {

    private Session session;

    public LijecnikDAO(Session session) {
        this.session = session;
    }
    
    public void save(Lijecnik lijecnik) {    	
    	if(lijecnik.getSifra() == null || lijecnik.getSifra().isEmpty()){
			throw new PrimaryKeyConstraintException("Šifra liječnika ne smije biti NULL");
		}
		
		Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.saveOrUpdate(lijecnik);
            tx.commit();
        } catch (ConstraintViolationException e) {
            if (tx != null) tx.rollback();
            throw new PrimaryKeyConstraintException("Liječnik sa šifrom već postoji u bazi podataka");
        }  	
    }
    
    public void delete(Lijecnik lijecnik) {
    	Transaction tx = null;
        try {
            tx = session.beginTransaction();
            
            Bolnica bolnica = lijecnik.getBolnica();
            List<Pacijent> pacijenti = lijecnik.getPacijenti();

            if(bolnica != null && bolnica.getLijecnici() != null){
                bolnica.getLijecnici().remove(lijecnik);
                session.merge(bolnica);
            }
            for(Pacijent pacijent : pacijenti) {
                pacijent.setLijecnik(null);
                session.merge(bolnica);
            }
            
            session.delete(lijecnik);
            tx.commit();
        } catch (Exception e) {
            if (tx != null) tx.rollback();
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    public List<Lijecnik> load(Lijecnik lijecnikPrototype) {
    	Properties prop = new Properties();
        StringBuilder sb = new StringBuilder();
        sb.append("select l from Lijecnik as l");
        if (lijecnikPrototype.getSifra() != null) {
            sb.append(" where l.sifra = :sifra");
            prop.put("sifra", lijecnikPrototype.getSifra());
        }
                                        
        return (List<Lijecnik>) session.createQuery(sb.toString()).setProperties(prop).list();
    }
    
    public List<Lijecnik> loadAll() {
    	return (List<Lijecnik>) session.createQuery("select l from Lijecnik as l").list();
    }

}
